﻿using Max.PH5_2004A.Shopping.IRespository;
using Max.PH5_2004A.Shopping.IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace Max.PH5_2004A.Shopping.Service
{
    public class BaseService<T> : IBaseService<T> where T : class, new()
    {
        ICRUDRespository<T> _respository;
        public BaseService(ICRUDRespository<T> respository)
        {
            _respository = respository;
        }

        #region 添加的实现
        public int Insert(T t)
        {
            int result = _respository.Insert(t);

            return result;
        }

        public int Insert(List<T> ts)
        {
            for (int i = 0; i < ts.Count; i++)
            {
                _respository.Insert(ts[i]);
            }

            //正常在仓储层定义批量操作的方法，用事务实现。
            #region 其它循环
            //foreach (var item in ts)
            //{
            //    _respository.Insert(item);
            //}

            //ts.ForEach(t => { 
            //    _respository.Insert(t); 
            //});

            #endregion

            return ts.Count;
        }

        #endregion

        #region 删除的实现

        public int Delet(string id)
        {
            var result = _respository.Delete(id);
            return result;
        }

        public int Delete(List<string> ids)
        {
            for (int i = 0; i < ids.Count; i++)
            {
                _respository.Delete(ids[i]);
            }
            return ids.Count;
        }

        //仓储没有提供对应的接口方法
        public int Delete(T t)
        {            
            throw new NotImplementedException();
        }

        //仓储没有提供对应的接口方法
        public int Delete(List<T> ts)
        {
            throw new NotImplementedException();
        }

        #endregion

        #region 修改的实现
        public int Update(T t)
        {
            var result = _respository.Update(t);
            return result;
        }

        public int Update(List<T> ts)
        {
            ts.ForEach(t=>_respository.Update(t));
            return ts.Count;
        }
        #endregion

        #region 查询的实现

        //查询所有数据
        public IQueryable<T> Select()
        {
            var list = _respository.Select();
            return list;
        }

        //根据查询条件查询（注意：查询条件不定-是指不知道查哪个字段，也不知道具体有几个查询条件）
        //这个参数就是linq表达式（表达式不参与计算）
        public IQueryable<T> Select(Expression<Func<T, bool>> where)
        {
            //将表达式转换为委托
            //将委托作为查询参数进行查询
            //var func = where.Compile();

            var list = _respository.Select().Where(where).AsQueryable();

            return list;
        }

        public IQueryable<T> Select<TKey>(Expression<Func<T, bool>> where, 
            Expression<Func<T, TKey>> sort, bool isAsc)
        {
            var list = this.Select(where);

            //如果是升序 就是OrderBy，如果是降序则是OrderByDescending
            if(isAsc)
            {
                list = list.OrderBy(sort);
            }
            else
            {
                list = list.OrderByDescending(sort);
            }
            return list;
        }

        public IQueryable<T> Select<TKey>(Expression<Func<T, bool>> where, 
            Expression<Func<T, TKey>> sort, bool isAsc, 
            int pageIndex, int pageSize, out int total)
        {
            var list = this.Select(where);

            //如果是升序 就是OrderBy，如果是降序则是OrderByDescending
            if (isAsc)
            {
                list = list.OrderBy(sort);
            }
            else
            {
                list = list.OrderByDescending(sort);
            }
            //在分页之前，需要获取符合条件的总记录数
            total = list.Count();

            //分页
            list = list.Skip((pageIndex - 1) * pageSize).Take(pageSize);

            return list;
        }

        public T SelectById(string id)
        {
            return null;
        }


        #endregion
    }
}
